//把一个数组最开始的若干个元素搬到数组的末尾，我们称之为数组的旋转。输入一个递增排序的数组的一个旋转，输出旋转数组的最小元素。例如，数组 [3,4,5,1,2
//] 为 [1,2,3,4,5] 的一个旋转，该数组的最小值为1。 
//
// 示例 1： 
//
// 输入：[3,4,5,1,2]
//输出：1
// 
//
// 示例 2： 
//
// 输入：[2,2,2,0,1]
//输出：0
// 
//
// 注意：本题与主站 154 题相同：https://leetcode-cn.com/problems/find-minimum-in-rotated-
//sorted-array-ii/ 
// Related Topics 数组 二分查找 👍 431 👎 0


package leetcode.editor.cn1;

//Java：旋转数组的最小数字
public class XuanZhuanShuZuDeZuiXiaoShuZiLcof {
    public static void main(String[] args) {
        Solution solution = new XuanZhuanShuZuDeZuiXiaoShuZiLcof().new Solution();
        // TO TEST
        System.out.println(solution.minArray(new int[]{3,4,5,1,2}));
        System.out.println(solution.minArray(new int[]{4,5,6,7,0,1,2}));
        System.out.println(solution.minArray(new int[]{2, 2, 2, 0, 1}));
    }

    //leetcode submit region begin(Prohibit modification and deletion)
    class Solution {
        public int minArray(int[] numbers) {
            int nlen = numbers.length;
            if (nlen == 0)
                return -1;
            if (nlen == 1)
                return numbers[0];
            int i = 0, j = nlen - 1;
            if (numbers[j] > numbers[i])
                return numbers[0];
            int m = -1;
            while (i < j) {
                m = (i + j) / 2;
                // 始终跟最右边的数字进行比较
                if (numbers[m] > numbers[j]) {
                    // 最小值在m的右边
                    i = m + 1;
                } else if (numbers[m] < numbers[j]) {
                    // 最小值在m的左边
                    j = m;
                } else {
                    // 忽略最右边的端点
                    j = j - 1;
                }
            }
            // i == j
            return numbers[i];
        }
    }
//leetcode submit region end(Prohibit modification and deletion)

}
